package Find;

import Mask.MaskFilter;

import java.io.File; // Импортируем класс для работы с файловой системой
import java.util.Date; // Класс для работы с датой и временем
import java.util.Collections; // Класс шаблонов (нужен для сортировки)
import java.util.ArrayList; // Класс динамических массивов
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class FindFiles {

	/** Правила пользования классом
	
	- Содержимое директории выводит функция contentDirectory;
	
	- Ключ recursive отвечает за рекурсивный поиск;
	
	- Ключ atribute отвечает за вывод атрибутов файла;
	
	- Для отбора файлов по критерию (маске или регэкспу) требуется указание ссылки на объект типа MaskFilter;
	*/
	
	public boolean atributes = false; // флаг атрибутов файла
	public boolean recursive = false; // флаг рекурсивного поиска
	
	public MaskFilter pmask = null;   // Объект фильтрации маски
	
	public void contentDirectory(File InputDir) {
		try {			
			File[] FileObjects = InputDir.listFiles(pmask);// Сохраняем список файлов заданной директории (с учётом возможно заданной маски)
			
			ArrayList <File> Files = new ArrayList <File> (); 	// массив файлов
			ArrayList <File> Directories = new ArrayList <File> (); // массив каталогов
		
			for (File f: FileObjects) {
				if (!f.isDirectory()) {// Отличаем файл от директории
					Files.add(f);	// Добавляем файл в массив файлов
				} else {
					Directories.add(f); // а директорию в массив директорий
				}
			}
			
			Collections.sort(Directories /*, String.CASE_INSENSITIVE_ORDER */); // Сортировка списка файлов и папок
			Collections.sort(Files /*, String.CASE_INSENSITIVE_ORDER */);

			print(Directories);
			print(Files);
			
			if (recursive) {
				for (File d: Directories) {
					System.out.println("\n" + d + ":");
					contentDirectory(d);	// Рекурсивный вызов
				}
			}
		} catch (NullPointerException e) { // Обращение к несуществующему либо недоступному каталогу
			System.err.println("Error! \"" + InputDir + "\": no access, or path not found.");
		}
	}
	
	private void print(ArrayList <File> files) {
		try {
			for (File f: files) {
				if (f.isDirectory()) {
					System.out.println("DIR:  "+ f.getName() + File.separator);
				} else {
					if (atributes) { // если задан ключ вывода атрибутов файла
						System.out.println("FILE: "+ f.getPath() + /* getCanonicalPath - ??? */
							"\n" + f.getParent() + "\t" + f.getName() + "\t"+ (f.length() / 1024)+ "\t" + 
							new Date (f.lastModified ()) + "\n" );
						
//						"\n\tFile size: " + f.length() + " B" +
//						"\n\tDate of last change: "+ new Date (f.lastModified ()) +
//						"\n\tFile is readable: " + f.canRead() +
//						"\n\tFile is writable: " + f.canWrite()+ "\n");
					} else		// иначе простой вывод имени
						System.out.println("FILE: "+ f.getName());
				}
			}
		} catch (NullPointerException e) {
			System.err.println("Error! \"" /*+ path*/ + "\": no access, or path not found.\n");
		}
	}
} // class FindFiles
